package com.liuzhihang.doc.view.utils;

import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiEnumConstant;
import com.intellij.psi.PsiMethod;

//fpc 新增
public class PsiClassTypeChecker {

  /*  *//**
     * 判断 PsiClass 是否为接口
     *//*
    public static boolean isInterface(PsiClass psiClass) {
        return psiClass != null && psiClass.isInterface();
    }

    *//**
     * 判断 PsiClass 是否为枚举
     *//*
    public static boolean isEnum(PsiClass psiClass) {
        if (psiClass == null) return false;
        // 枚举类会包含枚举常量
        PsiEnumConstant[] enumConstants = psiClass.getEnumConstants();
        return enumConstants != null && enumConstants.length > 0;
        // 或直接使用 isEnum() 方法（IntelliJ IDEA 版本 >= 2020.3）
        // return psiClass.isEnum();
    }

    *//**
     * 判断 PsiClass 是否为注解
     *//*
    public static boolean isAnnotation(PsiClass psiClass) {
        if (psiClass == null) return false;
        // 注解类会实现 java.lang.annotation.Annotation 接口
        return psiClass.isAnnotationType();
    }

    *//**
     * 判断 PsiClass 是否为普通类（非接口、非枚举、非注解）
     *//*
    public static boolean isRegularClass(PsiClass psiClass) {
        return psiClass != null
                && !psiClass.isInterface()
                && !psiClass.isAnnotationType()
                && !isEnum(psiClass);
    }

    *//**
     * 判断 PsiClass 是否为匿名内部类
     *//*
    public static boolean isAnonymousClass(PsiClass psiClass) {
        return psiClass != null && psiClass.isAnonymous();
    }

    *//**
     * 判断 PsiClass 是否为抽象类
     *//*
    public static boolean isAbstractClass(PsiClass psiClass) {
        if (psiClass == null) return false;
        // 抽象类有 abstract 修饰符，且不是接口或枚举
        return psiClass.hasModifierProperty("abstract")
                && !psiClass.isInterface()
                && !isEnum(psiClass);
    }
*/
    /**
     * 判断 PsiClass 是否为 JavaBean（简单判断：有无参构造和 getter/setter）
     */
    public static boolean isJavaBean(PsiClass psiClass) {
       if (psiClass == null ) {
            return false;
        }

        // 检查有无参构造函数
        boolean hasDefaultConstructor = false;
        PsiMethod[] constructors = psiClass.getConstructors();
        for (PsiMethod constructor : constructors) {
            if (constructor.getParameterList().getParametersCount() == 0) {
                hasDefaultConstructor = true;
                break;
            }
        }

        // 检查是否有 getter/setter 方法
        boolean hasGetterSetter = false;
        PsiMethod[] methods = psiClass.getMethods();
        for (PsiMethod method : methods) {
            String name = method.getName();
            if ((name.startsWith("get") && !name.startsWith("getClass") && !name.startsWith("getBytes") && !name.startsWith("getChars")  &&  name.length() > 3) ||
                    (name.startsWith("set") && name.length() > 3) ||
                    (name.startsWith("is") && !name.startsWith("isEmpty") && !name.startsWith("isBlank") && !name.startsWith("isLatin1") && name.length() > 2)) { // 布尔类型的 getter 可能以 is 开头
                hasGetterSetter = true;
                break;
            }
        }

        return hasDefaultConstructor && hasGetterSetter;
    }
}